﻿using System;
using System.ComponentModel;

namespace SksApp
{
    /// <summary>Müşteri</summary>
    [DisplayName("Müşteri")]
    public class PrnMusteri
    {
        /// <summary>No</summary>
        [DisplayName("No")]
        public int Id { get; set; }
        /// <summary>Kodu</summary>
        [DisplayName("Kodu")]
        public string Code { get; set; }
        /// <summary>Adı</summary>
        [DisplayName("Adı")]
        public string Name { get; set; }
        /// <summary>Adresi</summary>
        [DisplayName("Adresi")]
        public string Address { get; set; }
        /// <summary>Vergi Dairesi</summary>
        [DisplayName("Vergi Dairesi")]
        public string TaxOffice { get; set; }
        /// <summary>Vergi Numarası</summary>
        [DisplayName("Vergi Numarası")]
        public string TaxNo { get; set; }
        /// <summary>İndirim Oranı</summary>
        [DisplayName("İndirim Oranı")]
        public byte DiscountRate { get; set; }
        /// <summary>Fiyat Numarası</summary>
        [DisplayName("Fiyat Numarası")]
        public byte PriceNo { get; set; }
        /// <summary>Puanı</summary>
        [DisplayName("Puanı")]
        public decimal Points { get; set; }
        [DisplayName("Telefon")]
        public string Telefon { get; set; }
        [DisplayName("Eski Bakiye")]
        public decimal EskiBakiye { get; set; }
        [DisplayName("Yeni Bakiye")]
        public decimal YeniBakiye { get; set; }
    }

    [DisplayName("Kampanya")]
    public class PrnKampanyaBilgiSatir
    {
        [DisplayName("Kampanya Adı")]
        public string Aciklama { get; set; }

        [DisplayName("Indirim Tutarı")]
        public decimal IndirimTutari { get; set; }
    }

    [DisplayName("Ürün")]
    public class PrnUrun
    {
        [DisplayName("Kodu")]
        public string Kodu { get; set; }

        [DisplayName("Barkodu")]
        public string Barcode { get; set; }

        [DisplayName("Ürün Adı")]
        public string Name { get; set; }

        [DisplayName("Birimi")]
        public string Unit { get; set; }

        [DisplayName("Miktarı")]
        public decimal Amount { get; set; }

        [DisplayName("Birim Fiyatı")]
        public decimal UnitPrice { get; set; }

        [DisplayName("Toplam Tutar")]
        public decimal TotalPrice { get; set; }

        [DisplayName("Indirim Tutarı")]
        public decimal DiscountTotal { get; set; }

        [DisplayName("Kdv Oranı")]
        public decimal VatRate { get; set; }

        [DisplayName("Birim Katsayısı")]
        public decimal UnitRatio { get; set; }

    }

    /// <summary>Yazar Kasa</summary>
    [DisplayName("Yazar Kasa")]
    [Serializable]
    public class PrnKasa
    {
        /// <summary>No</summary>
        [DisplayName("No")]
        public int Id { get; set; }
        /// <summary>ŞubeId</summary>
        [DisplayName("Şube Kodu")]
        public int BranchOfficeCode { get; set; }

        /// <summary>Kodu</summary>
        [DisplayName("Kodu")]
        public string Code { get; set; }

        /// <summary>Kodu</summary>
        [DisplayName("Tanım")]
        public string Name { get; set; }

        public override string ToString()
        {
            return this.Name;
        }
    }

    /// <summary>Kasiyer</summary>
    [DisplayName("Kasiyer")]
    public class PrnKasiyer
    {
        /// <summary>No</summary>
        [DisplayName("No")]
        public int Id { get; set; }

        /// <summary>Kodu</summary>
        [DisplayName("Kodu")]
        public string Code { get; set; }

        /// <summary>Adı</summary>
        [DisplayName("Adı")]
        public string Name { get; set; }

        public override string ToString()
        {
            return this.Name;
        }
    }

    /// <summary>Döviz Tipi</summary>
    public enum CurrencyOption : byte
    {
        /// <summary>Türk Lirası</summary>
        TL = 0,
        /// <summary>Amerikan Doları</summary>
        USD = 1,
        /// <summary>Avrupa Para Birimi</summary>
        EUR = 2,
        /// <summary>İngiliz Sterlini</summary>
        GBP = 3,
        /// <summary>Azerbaycan Manatı</summary>
        AZN = 4
    }

    [DisplayName("Evrak Bilgileri")]
    public class PrnPosDetail
    {
        [DisplayName("Belge No")]
        public string InvoiceNo { get; set; }

        [DisplayName("Tarih")]
        public string Date { get; set; }

        [DisplayName("Saat")]
        public string Time { get; set; }

        [DisplayName("Toplam")]
        public decimal Total { get; set; }

        [DisplayName("Iskonto")]
        public decimal Discount { get; set; }

        [DisplayName("Ara Toplam")]
        public decimal SubTotal { get; set; }

        [DisplayName("Masraf")]
        public decimal Expense { get; set; }

        [DisplayName("Kdv Toplam")]
        public decimal Vat { get; set; }

        [DisplayName("Yekün")]
        public decimal GeneralTotal { get; set; }

        [DisplayName("Ödenen Tutar")]
        public decimal PaymentTotal { get; set; }

        [DisplayName("Para Üstü")]
        public decimal Remainder { get; set; }

        [DisplayName("Varsayılan Para Birimi")]
        public CurrencyOption DefaultCurrency { get; set; }

        [DisplayName("Yazı ile Tutar")]
        public string CurrencyToString { get; set; }

        [DisplayName("Evrak Barkodu")]
        public string UNIQUEID { get; set; }

        [DisplayName("Kazanılan Puan")]
        public decimal PuanTutari { get; set; }

        [DisplayName("Toplam Puan")]
        public decimal ToplamPuan { get; set; }
    }

    public class PrnInvoice
    {
        private BindingList<PrnUrun> _Products = new BindingList<PrnUrun>();
        private PrnMusteri _Customer = new PrnMusteri();
        private PrnPosDetail _ustbilgiler = new PrnPosDetail();
        private PrnKasa _kasa = new PrnKasa();
        private PrnKasiyer _kasiyer = new PrnKasiyer();
        BindingList<PrnOdemeDetay> _odemeDetayList = new BindingList<PrnOdemeDetay>();

        [DisplayName("Ürünler")]
        public BindingList<PrnUrun> Products
        {
            get { return this._Products; }
            set { this._Products = value; }
        }

        [DisplayName("Müşteri")]
        public PrnMusteri Customer
        {
            get { return this._Customer; }
            set { this._Customer = value; }
        }

        [DisplayName("Evrak Bilgileri")]
        public PrnPosDetail UstBilgiler { get { return _ustbilgiler; } set { _ustbilgiler = value; } }

        [DisplayName("Yazar Kasa")]
        public PrnKasa Cash { get { return _kasa; } set { _kasa = value; } }

        [DisplayName("Kasiyer")]
        public PrnKasiyer Cashier { get { return _kasiyer; } set { _kasiyer = value; } }

        [DisplayName("Ödeme Detayları")]
        public BindingList<PrnOdemeDetay> OdemeTipleri { get { return _odemeDetayList; } set { _odemeDetayList = value; } }

    }

    public class PrnCariEvrak
    {
        private PrnMusteri _Customer = new PrnMusteri();
        private PrnPosDetail _ustbilgiler = new PrnPosDetail();
        private PrnKasa _kasa = new PrnKasa();
        private PrnKasiyer _kasiyer = new PrnKasiyer();
        BindingList<PrnOdemeDetay> _odemeDetayList = new BindingList<PrnOdemeDetay>();

        [DisplayName("Müşteri")]
        public PrnMusteri Customer
        {
            get { return this._Customer; }
            set { this._Customer = value; }
        }

        [DisplayName("Evrak Bilgileri")]
        public PrnPosDetail UstBilgiler { get { return _ustbilgiler; } set { _ustbilgiler = value; } }

        [DisplayName("Yazar Kasa")]
        public PrnKasa Cash { get { return _kasa; } set { _kasa = value; } }

        [DisplayName("Kasiyer")]
        public PrnKasiyer Cashier { get { return _kasiyer; } set { _kasiyer = value; } }

        [DisplayName("Ödeme Detayları")]
        public BindingList<PrnOdemeDetay> OdemeTipleri { get { return _odemeDetayList; } set { _odemeDetayList = value; } }
    }


    /// <summary>Ödeme Detayları</summary>
    [DisplayName("Ödeme Detay")]
    public class PrnOdemeDetay
    {
        /// <summary>Belge Tipi</summary>
        [DisplayName("Belge Tipi")]
        public string BelgeTipi { get; set; }

        /// <summary>Adı</summary>
        [DisplayName("Adı")]
        public string Adi { get; set; }

        /// <summary>Tutar</summary>
        [DisplayName("Tutar")]
        public decimal Tutar { get; set; }
    }
}
